/* Использование функций нелокальных переходов */

#include <90s2313.h> 	// подключаем заголовочный файл используемого
// микроконтроллера AVR
/* Перед использованием функций нелокальных переходов
   подключим заголовочный файл setjmp.h */
#include <setjmp.h>

/* объявим переменную, которая будет использоваться
   для хранения состояния CPU */
jmp_buf store_cpu;	// тип данных jmp_buf определен в заголовочном
// файле setjmp.h

/* объявим и определим функцию, которая что-то делает,
   например, обрабатывает ошибку, а затем совершает длинный
   нелокальный переход */
void holder_err (void)
{
[группа операторов 1] 	// здесь что-то делается
longjmp(store_cpu,15); 	// здесь восстанавливается состояние CPU и
// совершается длинный нелокальный переход в
// основную функцию программы
// 15 - это значение, которое теперь будет
// возвращать функция setjmp. Оно может быть
// любым ненулевым
}

/* Основная функция программы */
void main(void)
{
int x; 			// эта локальная переменная не будет сохранена
// после выполнения функции longjmp, т.к.
// она объявлена без атрибута volatile
volatile int y; 		// эта локальная переменная будет сохранена
// после выполнения функции longjmp, т.к.
// она объявлена с атрибутом volatile

[группа операторов 2] 	// здесь что-то делается

if (setjmp(store_cpu)==0) 	// оператор if. Функция setjmp сохраняет
// состояние CPU в переменной store_cpu и
// возвращает 0
{
[группа операторов 3] 	// здесь что-то делается
holder_err(); 		// вызывается функция holder_err
}
else 					// длинный нелокальный переход из
[группа операторов 4] 	// из функции holder_err будет
// осуществлен сюда, т.к. функция setjmp
// теперь вернет значение 15, что не
// равно 0, т.е. условие оператора if
// будет ложным
}
